package com.Day12;

import java.io.*;

/**
 * @author: 若若叶
 * @date: 2021/7/21 9:25
 * FileName: CopyDirs
 * Description: 拷贝一个目录及其子目录下的文件或文件（就是这个目录下的所有东西）
 * 把E:\Tools拷贝到D:\Tools
 * 思路：1、因为拷贝，新建两个文件，一个源，一个目标
 *      2、新建拷贝方法，两个参数，一个源，一个目标
 *      3、拷贝方法，先判断是否为文件，是的话，就是文件拷贝的方法
 *      4、不是文件，获取此目录的各个子目录；
 *      5、遍历每个子目录，判断是否为目录，不是目录，直接到第8条
 *      6、获取此目录的绝对路径，使用字符串的拼接，获取新的目的路径
 *      7、判断此目录名是否存在，不存在新建一个
 *      8、再次调用拷贝方法（递归），源文件换为子目录名，目标文件不变
 *      9、一直递归直到不是目录是文件，则执行文件拷贝。
 */
public class CopyDirs {
    public static void main(String[] args) {
        //新建拷贝的源目录
        File src = new File("E:\\Tools");
        //新建目标目录
        File dest = new File("D:\\");
        //调用拷贝函数
        copyDirs(src,dest);
    }

    /**
     * 拷贝方法
     * @param src  源目录
     * @param dest  目标目录
     */
    private static void copyDirs(File src, File dest) {
        //判断是否是文件
        if (src.isFile()){
            //是文件
            //新建字节输入流
            FileInputStream fis = null;
            //新建字节输出流
            FileOutputStream fos = null;
            try {
                //获取源文件的绝对路径
                String srcDir = src.getAbsolutePath();
                //目标文件的绝对路径
                //如果不以“\\”结尾，则加上，
                //在最后加上源文件路径字符串的第4个字符开始，相当于E:\Tools去掉“E:\”
                //得到新的路径
                String newDir = (dest.getAbsolutePath().endsWith("\\")? dest.getAbsolutePath():(dest.getAbsolutePath()+"\\"))+srcDir.substring(3);
                //System.out.println(newDir);
                //新建输入流
                fis = new FileInputStream(srcDir);
                //新建输出流
                fos = new FileOutputStream(newDir);
                //设置单次读取的最大字节 1024*1024
                byte[] bytes = new byte[1024*1024];
                //设置单次读取的字节，为-1表示未读取到
                int readCount = 0;
                //循环直到readCount为-1
                while ((readCount = fis.read(bytes)) != -1) {
                    //写入，读多少，写多少，从本次的读取第一个到读取的地方
                    fos.write(bytes,0,readCount);
                }
                //写入的必要：刷新
                fos.flush();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //两个文件不为空，关闭文件
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fos != null) {
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            //退出方法
            return;
        }
        //获取目录下的文件集
        File[] files = src.listFiles();
        for (File file:files) {
            //System.out.println(file.getAbsolutePath());
            if (file.isDirectory()){
                //是目录
                //获取此目录的绝对路径
                String srcDir = file.getAbsolutePath();
                //如果不以“\\”结尾，则加上，
                //在最后加上源文件路径字符串的第4个字符开始，相当于E:\Tools去掉“E:\”
                //得到新的路径
                String newDir = (dest.getAbsolutePath().endsWith("\\")? dest.getAbsolutePath():dest.getAbsolutePath()+"\\")+srcDir.substring(3);
                //System.out.println(newDir);
                //以新路径新建一个目录
                File newFile = new File(newDir);
                if (!newFile.exists()){
                    //目录不存在，新建一个
                    newFile.mkdirs();
                }
            }
            //递归，源文件为上一级目录的子目录
            copyDirs(file,dest);
        }
    }
}
